// 属性装饰器，属性装饰器用来装饰定义在类顶部的属性（field）。
// 属性装饰器要么不返回值，要么返回一个函数，该函数会自动执行，用来对所装饰属性进行初始化。该函数的参数是所装饰属性的初始值，该函数的返回值是该属性的最终值。

function logged(value: any, context: ClassMethodDecoratorContext) {
  // console.log(value);  // undefined
  const { kind, name } = context;
  // @ts-ignore
  if (kind === "field") {
    return function (initialValue: any) {
      console.log(`initializing ${String(name)} with value ${initialValue}`);
      return initialValue;
    };
  }
}

/* class Color {
  // @ts-ignore
  @logged
  color = "green";
}
const c = new Color();
console.log(c.color);

function twice() {
  return (initialValue: any) => initialValue * 2;
}

class C {
  // @ts-ignore
  @twice
  field: number = 3;
}
console.log(new C().field); */ // 6

let acc: any;
function exposeAccess(value: any, { access }: { access: any }) {
  acc = access;
}
class Color {
  @exposeAccess
  color = "green";
}
const green = new Color();
console.log(green.color);
// access包含了属性name的存取器，可以对该属性进行取值和赋值。
console.log(acc.get(green));
acc.set(green, "red");
console.log(acc.get(green)); // 'red'
